package recursion

import "fmt"

// printOrder
func printOrder(slice []int) {
	printPermutation(slice, len(slice), len(slice))
}

// printPermutation 打印n个数的排列组合
func printPermutation(slice []int, n int, k int) {
	// k表示要处理的子数组的数据个数
	// 当要处理的子数组的数据个数为1时，数组排序确定，直接打印
	if k == 1 {
		for i := 0; i < n; i++ {
			fmt.Print(slice[i], " ")
		}
		fmt.Println()
	}

	// 对子数组数据进行处理，[k-1]位上的数据各种不同选择和剩下k-1个数据进行组合，这个K及之后的数据排列已经确定
	for i := 0; i < k; i++ {
		// 假设前k位都已经确定，遍历第K位的不同情况
		tmp := slice[i]
		slice[i] = slice[k-1]
		slice[k-1] = tmp

		printPermutation(slice, n, k-1)

		// 交换回来，恢复数组本来的顺序
		tmp = slice[i]
		slice[i] = slice[k-1]
		slice[k-1] = tmp
	}
}
